package Note_for_class;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-05-06
 * Time: 21:04
 */
public class Test0506 {
    public static void main8(String[] args) {
        //8.
        boolean a = true;
        System.out.println(!a);

        double x = 2.0;
        int y = 4;
        x /= ++y;//x = x / y == 2.0 / 5 == 0.4
        System.out.println(x);//0.4
    }
    public static void main(String[] args) {
        //7.求一个整数，在内存当中存储时，二进制1的个数(求的是补码中的1的个数)。例如：10(10) -> 0000 0000 0000 0000 0000 0000 0000 1010
        //                                                               ~、^、&、|  0000 0000 0000 0000 0000 0000 0000 0001
        //                                                                     &    0000 0000 0000 0000 0000 0000 0000 0010
        //                                                                          0000 0000 0000 0000 0000 0000 0000 0010
        //                                                                按位与 之后变成了：1010(2) -> 0010(2) -> 2(10)
        int n = 10;
        int i = 0;
        int count = 0;
        while(i < 32){
            if((n & (1 << i)) != 0){
                count++;
            }
            i++;
        }
        System.out.println(count);
    }
    public static void main6(String[] args) {
        //6.给定两个数，求这两个数的最大公约数输入：20 40 输出20 使用欧几里得算法（辗转相除法）解题
        int num1 = 12;//1 12、2 6、3 4
        int num2 = 16;//1 16、2 8、4 4
        int ret = gcd(num2, num1);
        System.out.println(ret);
    }

    public static int gcd(int a, int b) {
        // 保证a是非负数
        if (a < 0) {
            a = -a;
        }
        // 如果b为0，则a就是最大公约数
        if (b == 0) {
            return a;
        }
        // 否则递归调用gcd，b作为新的a，a和b的余数作为新的b
        return gcd(b, a % b);
    }
    public static void main5(String[] args) {
        //5.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100的值 (-1)^(i + 1) * (1 / i)
        /*double sum = 0.0;
        for (int i = 1; i <= 100 ; i++) {
            double ret = ((-1)^(i + 1)) * (1.0 / (i - 1));
            sum += ret;
        }
        System.out.println("总数为："+sum);//error*/

            /*double sum = 0.0;
            boolean isPositive = true; // 用于跟踪当前符号的变量

            for (int i = 1; i <= 100; i++) {
                double fraction = 1.0 / i; // 计算当前分数
                if (isPositive) {
                    sum += fraction; // 如果是正数，则加到总和中
                } else {
                    sum -= fraction; // 如果是负数，则从总和中减去
                }
                isPositive = !isPositive; // 切换符号
            }

            System.out.println("The sum is: " + sum);//The sum is: 0.688172179310195*/
        double sum = 0.0;
        boolean isPositive = true;
        //遍历
        for (int i = 1; i <= 100 ; i++) {
            //分为2种情况：+ 与 -
            double fraction = 1.0 / i;
            if(isPositive){
                sum += fraction;
            }else{
                sum -= fraction;
            }
            isPositive = !isPositive;//取反
        }
        System.out.println("总数为："+sum);
    }
    public static void main4(String[] args) {
        //4.求出0～n之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数，其各位数字的立方和确好等于该数本 身，如；153＝1^3＋5^3＋3^3，则153是一个“水仙花数“。）
        /*double base = 2.0;
        double exponent = 3.0;
        double result = Math.pow(base, exponent);
        System.out.println(result);//2.0^3 == 8.0*/
        //开始测试 使用pow函数 Math.pow(base, exponent) == base^exponent
        int n = 1000;
        System.out.println("0到" + n + "之间的所有水仙花数有：");
        for(int i = 0; i <= n; i++){
            if(isNarcissistic(i)){
                System.out.print(i + " ");
            }
        }
    }

    public static boolean isNarcissistic(int number) {
        int originalNumber = number; // 保存原始数字
        int sum = 0; // 初始化各位数字n次幂的和
        int digitCount = 0; // 位数
        //算出number是多少位数
        while (originalNumber > 0){
            originalNumber /= 10;
            digitCount++;
        }
        //重新赋值给originalNumber，让其重新变成初始值
        originalNumber = number;
        //各位数字n次幂的和
        while(originalNumber > 0){
            //每一位数是什么
            int digit = originalNumber % 10;
            //计算数的n次幂
            double ret = Math.pow(digit, digitCount);
            sum += ret;
            originalNumber /= 10;
        }
        //判断是否为水仙花数
        return number == sum;
    }
    public static void main3(String[] args) {
        //3.打印 X 图形
        int size = 5;
        //
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if(i == j || i + j == size - 1){
                    System.out.print("* ");
                }else{
                    System.out.print("  ");
                }
            }
            System.out.println();
        }
    }
    public static void main2(String[] args) {
        //2.给定一个数字，判定一个数字是否是素数: 2~sqrt(number) 遍历就行了
        int number = 17;
        //小于等于1的数都不是素数
        if(number <= 1){
            System.out.println(number+"不是素数");
        }
        // 如果能被整除，则不是素数
        for (int i = 2; i <= Math.sqrt(number) ; i++) {
            if(number % i == 0){
                System.out.println(number+"不是素数");
            }
        }
        System.out.println(number+"是素数");//17是素数
    }
    public static void main1(String[] args) {
        //1.编写程序数一下 1到 100 的所有整数中出现多少个数字9
        //9 19 29 39 49 59 69 79 89 99
        //91 92 93 94 95 96 97 98 99
        int num = 9;
        int count = 0;
        while(num <= 100){
            if(num % 10 == 9 || num / 10 == 9){
                count++;
            }
            num++;
        }
        System.out.println(count);
    }
}
